﻿#include <iostream>



void cleanup()
{
	// 这里来做一些清理工作
	std::cout << "cleanup!\n";
}



int main()
{
	std::cout << "Hello World!\n";


	int x{};
	std::cin >> x;

	if (x > 10) std::cout << x << " is greater than 10\n";
	else std::cout << x << " is not greater than 10\n";


	constexpr double gravity{ 9.8 };
	//如果constexpr条件的计算结果为true，则整个If-else将替换为true语句。
	if constexpr (gravity == 9.8) // 现在使用 constexpr if
		std::cout << "Gravity is normal.\n";
	else
		std::cout << "We are not on Earth.\n";


	//switch语句
	switch (x)
	{
	case 1:
		std::cout << "One";
		break;
	case 2:
		std::cout << "Two";
		break;
	case 3:
		std::cout << "Three";
		// return x;
		break;
	default:
		std::cout << "Unknown";
		break;
	}


	//如果没有中断或返回，执行将溢出到后续的case情况中
	switch (2)
	{
	case 1: // 不匹配
		std::cout << 1 << '\n'; // 跳过
	case 2: // 匹配
		std::cout << 2 << '\n'; // 从这里开始执行
	case 3:
		std::cout << 3 << '\n'; // 这里也会执行
	case 4:
		std::cout << 4 << '\n'; // 这里也会执行
	default:
		std::cout << 5 << '\n'; // 这里也会执行
	}


	//goto语句,避免使用goto
tryAgain: // 这是标签语句
	std::cout << "Enter a non-negative number: ";
	std::cin >> x;

	if (x < 0.0)
		goto tryAgain; // 这是goto语句

	std::cout << "The square root of " << x << " is " << std::sqrt(x) << '\n';



	//While语句
	int count{ 1 };
	while (count <= 10)
	{
		std::cout << count << ' ';
		++count;
	}
	//while (true)
	//{
	//    // 这个循环将无限执行
	//}




	 // do while循环
	int selection{};
	do
	{
		std::cout << "Please make a selection: \n";
		std::cout << "1) Addition\n";
		std::cout << "2) Subtraction\n";
		std::cout << "3) Multiplication\n";
		std::cout << "4) Division\n";
		std::cin >> selection;
	} while (selection != 1 && selection != 2 &&
		selection != 3 && selection != 4);

	std::cout << "done!\n";

	//for循环
	for (int i{ 1 }; i <= 10; ++i)
		std::cout << i << ' ';


	int i{ 0 };
	for (; i < 10; ) // 省略初始化语句和递增/递减表达式
	{
		std::cout << i << ' ';
		++i;
		// 如果i被4整除, 结束本轮迭代
		if ((i % 4) == 0)
			continue; // 进入下一次迭代
	}


	//具有多个计数器的循环
	for (int x{ 0 }, y{ 9 }; x < 10; ++x, --y)
		std::cout << x << ' ' << y << '\n';



	std::exit(0); // 结束程序执行，并将0返回给操作系统
	std::atexit(cleanup); //程序退出时自动调用指定的清理函数

	std::abort(); //程序异常终止
	std::terminate();// 函数通常与异常一起使用

	//
	//

	return EXIT_SUCCESS;
}

